package com.stone.design.mode.flyweight;

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Objects;

/**
 * 考试报名信息生产工厂类
 *
 * @author Mr_wenpan@163.com 2022/03/14 21:29
 */
public class SignInfoFactory {

    /**
     * 缓冲池(如果有特定需求，这里也可以设计出TTLMap)
     */
    private static final HashMap<String, SignInfo> POOL = new HashMap<>();

    /**
     * 一般来说为了使代码更好的向下兼容，上线后的代码我们都不采取删除操作，而是使用@Deprecated标注他为过时的方法
     */
    @Deprecated
    public static SignInfo getSignInfo() {
        // 每一次获取都需要创建一个对象返回，如果大并发下可能导致OOM
        return new SignInfo();
    }

    /**
     * 带缓冲池的享元模式的工厂方法
     * 注意：由于SignInfo是有状态的，并且可能会在多线程情况下被使用到，那么需要注意多线程修改时的线程安全问题
     */
    public static SignInfo getSignInfo(String unionKey) {
        if (StringUtils.isBlank(unionKey)) {
            throw new RuntimeException("unionKey can not be null. please check.");
        }
        SignInfo signInfo = POOL.get(unionKey);
        if (Objects.isNull(signInfo)) {
            signInfo = new SignInfoPool(unionKey);
            POOL.put(unionKey, signInfo);
        }
        return signInfo;
    }
}
